using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WinLOAtest.Test
{
    /// <summary>
    /// 测试GenerateBinaryString方法
    /// </summary>
    public class TestGenerateBinaryString
    {
        public static void RunTests()
        {
            Console.WriteLine("=== GenerateBinaryString 方法测试 ===");
            Console.WriteLine();

            // 测试1：只有功能1启用
            TestCase("只有功能1启用", new int[] { 1 });

            // 测试2：功能1和功能2启用
            TestCase("功能1和功能2启用", new int[] { 1, 2 });

            // 测试3：所有功能都启用
            TestCase("所有功能都启用", Enumerable.Range(1, 20).ToArray());

            // 测试4：没有功能启用
            TestCase("没有功能启用", new int[] { });

            // 测试5：只有功能20启用
            TestCase("只有功能20启用", new int[] { 20 });

            // 测试6：奇数功能启用
            TestCase("奇数功能启用", new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 });

            // 测试7：偶数功能启用
            TestCase("偶数功能启用", new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 });

            // 测试8：中间几个功能启用
            TestCase("中间几个功能启用", new int[] { 8, 9, 10, 11, 12 });

            Console.WriteLine("=== 测试完成 ===");
        }

        private static void TestCase(string description, int[] positions)
        {
            try
            {
                string result = Form1.GenerateBinaryString(positions, 20);
                Console.WriteLine($"测试: {description}");
                Console.WriteLine($"输入位置: [{string.Join(", ", positions)}]");
                Console.WriteLine($"结果字符串: {result}");
                Console.WriteLine($"字符串长度: {result.Length}");
                
                // 验证结果
                bool isValid = true;
                for (int i = 0; i < 20; i++)
                {
                    char expected = positions.Contains(i + 1) ? '1' : '0';
                    if (result[i] != expected)
                    {
                        isValid = false;
                        break;
                    }
                }
                
                Console.WriteLine($"验证结果: {(isValid ? "✓ 通过" : "✗ 失败")}");
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"测试失败: {ex.Message}");
                Console.WriteLine();
            }
        }

        /// <summary>
        /// 测试异常情况
        /// </summary>
        public static void RunExceptionTests()
        {
            Console.WriteLine("=== 异常情况测试 ===");
            Console.WriteLine();

            // 测试1：位置超出范围
            try
            {
                Form1.GenerateBinaryString(new int[] { 21 }, 20);
                Console.WriteLine("测试失败：应该抛出异常");
            }
            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine("✓ 位置超出范围异常测试通过");
            }

            // 测试2：位置为0
            try
            {
                Form1.GenerateBinaryString(new int[] { 0 }, 20);
                Console.WriteLine("测试失败：应该抛出异常");
            }
            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine("✓ 位置为0异常测试通过");
            }

            // 测试3：负数位置
            try
            {
                Form1.GenerateBinaryString(new int[] { -1 }, 20);
                Console.WriteLine("测试失败：应该抛出异常");
            }
            catch (ArgumentOutOfRangeException)
            {
                Console.WriteLine("✓ 负数位置异常测试通过");
            }

            // 测试4：null参数
            try
            {
                Form1.GenerateBinaryString(null, 20);
                Console.WriteLine("测试失败：应该抛出异常");
            }
            catch (ArgumentNullException)
            {
                Console.WriteLine("✓ null参数异常测试通过");
            }

            Console.WriteLine("=== 异常测试完成 ===");
        }
    }
}
